import java.util.Arrays;

class Person {
    String name;
    int money;

    public Person(String name, int money) {
        this.name = name;
        this.money = money;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", money=" + money +
                '}';
    }
}

public class StringTest {

    public static void main(String[] args) {
        //其他字符串方法
        //1.检测 一个子串是否以什么字符串开头
        String s1 = "csgo";
        System.out.println(s1.startsWith("cs"));//true

        //2.检测 一个子串是否以什么字符串结尾
        System.out.println(s1.endsWith("go"));//true

        //3.删除字符串两端的空格
        String s2 = "  abc    c    ";
        String ret = s2.strip();
        System.out.print(ret);
        System.out.println("000");//abc    c000

        String ret2 = s2.trim();
        System.out.println(ret2);//abc    c
    }

    public static void main7(String[] args) {
        //字符串截取
        String s1 = "hello CS2";
        String sub1 = s1.substring(3);//从下标3开始截取 并返回截取后的新串
        System.out.println(sub1);//lo CS2

        String sub2 = s1.substring(s1.indexOf('C'), s1.indexOf('2') + 1);//截取范围 [beginIndex endIndex)
        System.out.println(sub2);//CS2
    }

    public static void main6(String[] args) {
        //字符串拆分
        String s1 = "100186@qq.com";
        String[] ss1 = s1.split("@");
        System.out.println(Arrays.toString(ss1));// [100186, qq.com]

        //有多个分隔字符 之间可以 | 分隔
        String[] ss2 = s1.split("@|\\.");// . + * \ 都需要转义字符 转义(\\ 的意思是第一个为转义字符\ 将第二个\ 转义为 \)
        System.out.println(Arrays.toString(ss2));// [100186, qq, com]

        String s2 = "https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/String.html";
        String[] ss3 = s2.split("/|\\.|:");//要是两个分隔符之间没有字符则拆分后用空格代替
        System.out.println(Arrays.toString(ss3));// [https, , , docs, oracle, com, en, java, javase, 16, docs, api, java, base, java, lang, String, html]

        String s3 = "C:\\Users\\Public\\Desktop";//一个 \ 是将其后的字符转义 故需要两个 \\ 来表示 \
        String[] ss4 = s3.split("\\\\");// \\\\ 两两一组 分别表示一个 \
        System.out.println(Arrays.toString(ss4));//[C:, Users, Public, Desktop]

        String[] ss5 = s3.split("\\\\", 2);//将原字符串最多分割为 多少个新字符串
        System.out.println(Arrays.toString(ss5));//[C:, Users\Public\Desktop]

        String[] ss6 = s3.split("\\\\", 7);
        System.out.println(Arrays.toString(ss6));//[C:, Users, Public, Desktop]
    }

    public static void main5(String[] args) {
        //字符串的替换 java中所有理论上会改变 字符串本身的方法 都是返回一个新的字符串 原字符串不变
        String s1 = "ak47 m4a1 ak47";
        String s2 = s1.replace('4', '8');//替换整个字符串中的单个字符
        System.out.println(s2);//ak87 m8a1 ak87
        String s3 = s1.replace("ak47", "akm");//替换整个字符串中的字符串为另一个字符串 传入参数为 CharSequence
        System.out.println(s3);//akm m4a1 akm

        String s4 = s1.replaceAll("ak47", "AWP");//替换整个字符串中的字符串为另一个字符串 传入参数为 String
        System.out.println(s4);//AWP m4a1 AWP

        String s5 = s1.replaceFirst("ak47", "AWM");//只替换第一个匹配的字符串
        System.out.println(s5);//AWM m4a1 ak47
    }

    public static void main4(String[] args) {
        //字符串转换
        //1.基本数据类型转换为一个字符串

        int a = 10;
        String str1 = String.valueOf(a);
        System.out.println(str1);//10

        double d = 3.1415926;
        String str2 = String.valueOf(d);
        System.out.println(d);//3.1415926

        //2.将一个自定义的类转换成字符串 需要重写类的toString
        Person p1 = new Person("王", 999);
        System.out.println(String.valueOf(p1));//Person{name='王', money=999}

        //3.将数组转换为字符串
        int[] arr = new int[]{1, 2, 3, 4};
        String str3 = Arrays.toString(arr);
        System.out.println(str3);//[1, 2, 3, 4]

        //4.将字符串转换成基本数据类型
        String str4 = "1234";
        int b = Integer.parseInt(str4);
        System.out.println(b + 1);//1235

        double d2 = Double.parseDouble(str4);
        System.out.println(d2 + 0.6);//1234.6
    }

    public static void main3(String[] args) {
        //字符串查找
        String s1 = "0123456789";

        //从前往后查找第一个出现的'6' 并返回其下标 若没找到返回一个负数
        System.out.println(s1.indexOf('6'));//6
        //从前往后查找第一次出现的"3456" 并返回匹配的第一个字符的下标 没找到返回一个负数
        System.out.println(s1.indexOf("3456"));//3

        //指定开始查找的起始下标
        System.out.println(s1.indexOf('3', s1.indexOf('3') + 1));//-1
        //                              查找3 起始下标为 第一次出现3的下标+1 3后面没有3了 所以返回-1了

        System.out.println(s1.indexOf("456", s1.indexOf('4') + 1));//-1

        String s2 = "6006006";
        //从后往前查找字符 同样返回下标
        System.out.println(s2.lastIndexOf('6'));//6
        System.out.println(s2.lastIndexOf('6', s2.lastIndexOf('6') - 1));//3
        System.out.println(s2.lastIndexOf("006"));//4

        System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++");
        for (int i = 0; i < s2.length(); i++) {
            System.out.print(s2.lastIndexOf("006", i) + " ");
        }//-1 1 1 1 4 4 4
        //lastIndexOf在查找字符串时fromIndex是指 子串的起始下标 截止至 fromIndex

        System.out.println();
        for (int i = 0; i < s2.length(); i++) {
            System.out.print(s2.lastIndexOf('6', i) + " ");
        }//0 0 0 3 3 3 6
    }

    public static void main2(String[] args) {
        //String 对象的比较
        String str1 = "abcd";
        String str2 = "abcd";
        String str3 = "abc";
        System.out.println(str1 == str2);//jdk17 true 但直接比较引用变量 比较的也可能是他们所引用的对象的地址
        //没有歧义的写法应该是
        System.out.println(str1.equals(str2));//true
        System.out.println(str1.equals(str3));//false

        System.out.println("====================================");
        //忽略大小写比较是否相等
        String str4 = "ABcde";
        String str5 = "abcdE";
        System.out.println(str4.equalsIgnoreCase(str5));//true

        System.out.println("====================================");
        //比较字符串的大小
        int ret1 = str1.compareTo(str2);
        int ret2 = str1.compareTo(str3);

        if (ret1 > 0) {
            System.out.println("str1 > str2");
        } else if (ret1 < 0) {
            System.out.println("str1 < str2");
        } else {
            System.out.println("str1 == str2");
        }//str1 == str2

        if (ret2 > 0) {
            System.out.println("str1 > str3");
        } else if (ret2 < 0) {
            System.out.println("str1 < str3");
        } else {
            System.out.println("str1 == str3");
        }//str1 > str3

        System.out.println("====================================");
        //忽略大小写比较字符串的大小

        String s1 = "AbCde";
        String s2 = "abcDE";
        System.out.println(s1.compareToIgnoreCase(s2));//0
    }

    public static void main1(String[] args) {
        //java中的String 属于引用类型 本质是一个类 private final byte[] value;
        //1.字符串构造
        String str1 = "Hello World";
        System.out.println(str1);//Hello World

        String str2 = new String("Hi Java");
        System.out.println(str2);//Hi Java

        //通过一个字符数组初始化一个字符串
        char[] chars = new char[]{'1', '2', '3'};
        String str3 = new String(chars);
        System.out.println(str3);//123

        //访问字符串中的单一个字符
        String str4 = "abcdefg";
        for (int i = 0; i < str4.length(); i++) {
            char ch = str4.charAt(i);
            System.out.print(ch + " ");
        }//a b c d e f g

    }
}
